﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HTTT.DataAccess.DataInf;
using HTTT.Utilities;

namespace HTTT.DataAccess
{
    public class HT_DispatchDAO : IHT_DispatchDAO
    {
        /// <summary>
        /// Gets all HT_Dispatch
        /// </summary>
        /// <returns></returns>
        /// 

        private static AppEntities dataContext;

        private IRepository<HT_Dispatch> repository;

        public HT_DispatchDAO()
        {
            dataContext = new AppEntities();
            repository = new RepositoryDAO<HT_Dispatch>(dataContext);
        }


        public IEnumerable<HT_Dispatch> GetAllHT_Dispatch()
        {
            return repository.GetQuery().OrderBy(aobj => aobj.Handled);

        }

        public HT_Dispatch GetHT_DispatchByID(Guid id)
        {
            return repository.Find(obj => obj.ID == id).SingleOrDefault();

        }

        public bool InsertHT_Dispatch(HT_Dispatch inHT_Dispatch)
        {
            if (inHT_Dispatch == null) return false;
            repository.Add(inHT_Dispatch);
            return repository.SaveChanges() > 0;
        }

        public bool UpdateHT_Dispatch(HT_Dispatch inHT_Dispatch)
        {
            if (inHT_Dispatch == null) return false;
            HT_Dispatch upHT_Dispatch = repository.First(obj => obj.ID == inHT_Dispatch.ID);

            if (upHT_Dispatch == null) return false;
            upHT_Dispatch.No = inHT_Dispatch.No;
            upHT_Dispatch.Name = inHT_Dispatch.Name;
            upHT_Dispatch.Sender = inHT_Dispatch.Sender;
            upHT_Dispatch.Reffer = inHT_Dispatch.Reffer;
            upHT_Dispatch.Note = inHT_Dispatch.Note;
            upHT_Dispatch.Handled = inHT_Dispatch.Handled;
            
            return repository.SaveChanges() > 0;
        }


        public ReturnValue<bool> DeleteHT_Dispatch(Guid id)
        {
            ReturnValue<bool> ret = new ReturnValue<bool>(false, "");
            try
            {
                HT_Dispatch objDel = repository.First(obj => obj.ID == id);
                ret = DelHT_Dispatch(objDel);
            }
            catch (Exception)
            {
                ret.RetValue = false;
                ret.Msg = "Dữ liệu đã được sử dung trong chương trình - không thể xóa !";
            }
            return ret;

        }
        public ReturnValue<bool> DelHT_Dispatch(HT_Dispatch inHT_Dispatch)
        {
            ReturnValue<bool> ret = new ReturnValue<bool>(false, "");
            if (inHT_Dispatch == null)
            {
                ret.Msg = "input null";
                return ret;
            }
            try
            {
                repository.Delete(inHT_Dispatch);
                ret.RetValue = repository.SaveChanges() > 0;
            }
            catch (System.Exception)
            {
                ret.RetValue = false;
                ret.Msg = "Dữ liệu đã được sử dung trong chương trình - không thể xóa !";
            }
            return ret;
        }

        public IEnumerable<HT_Dispatch> SearchHT_Dispatch(string keyword)
        {
            try
            {
                var r = from m in dataContext.HT_Dispatch
                        where(m.Name.Contains(keyword)
                        || m.No.Contains(keyword)
                        || m.Sender.Contains(keyword)
                        || m.Reffer.Contains(keyword)
                        )
                        select m;
                return r;

            }
            catch (Exception)
            {
                return null;
            }
        }
    }
}
